using System;
using System.Collections.Generic;
using System.Text;
using Ksibo;
using Ksibo.Modelo;
using Ksibo.Dados;
using Ksibo.Negocio;
using Ksibo.Negocio.Wrappers;
using NHibernate.Expression;

namespace Ksibo.Negocio
{
    class GerenciadorEmprestimo
    {
        /*
         * Devolve Revista Locada
         */
        public bool devolveRevista()
        {
            return false;
        }
        public static bool EfetuaEmprestimo(Emprestimo emp)
        {
            return ConexaoBD<Emprestimo>.Salva(emp);
        }
        public static Emprestimo RecuperaEmprestimo(int idUsuario, int idRevista)
        {
            return ConexaoBD<Emprestimo>.BuscaUnico(Expression.Eq("IdUsuario", idUsuario), Expression.Eq("IdRevista", idRevista));
        }
        public static bool EfetuaDevolucao(int idUsuario, int idRevista)
        {
            return ConexaoBD<Emprestimo>.Deleta(Expression.Eq("IdUsuario", idUsuario), Expression.Eq("IdRevista", idRevista));
        }
        /*
         * pegas as revistas locadas de um usuario
         */
        public static IList<RevistaEmprestimo> GetRevistasLocadas(int idUsuario)
        {

            IList<Emprestimo> listaLocada = ConexaoBD<Emprestimo>.Busca(Expression.Eq("IdUsuario", idUsuario));
            if (listaLocada != null && listaLocada.Count > 0)
            {
                IEnumerator<Emprestimo> emprestimos = listaLocada.GetEnumerator();
                int ids = 0;
                int[] valores = new int[listaLocada.Count];
                while (emprestimos.MoveNext())
                {
                    valores[ids] = emprestimos.Current.IdRevista;
                    ids++;
                }
                IList<Revista> revistas = ConexaoBD<Revista>.Busca(Expression.In("Id", valores));


                IList<RevistaEmprestimo> resultado = populaWrapper(listaLocada, revistas);

                return resultado;
            }
            else return null;

        }
        private static IList<RevistaEmprestimo> populaWrapper(IList<Emprestimo> emp, IList<Revista> rev)
        {
            IList<RevistaEmprestimo> populado = new List<RevistaEmprestimo>();


            IEnumerator<Emprestimo> emprestimos = emp.GetEnumerator();


            while (emprestimos.MoveNext())
            {
                RevistaEmprestimo wrapper_aux = new RevistaEmprestimo();
                // pegando a revista atual
                Revista revista_atual = getRevistaByIdRevista(emprestimos.Current.IdRevista, rev);
                wrapper_aux.NomeRevista = revista_atual.Nome;
                wrapper_aux.EdicaoRevista = revista_atual.Edicao;
                wrapper_aux.AnoRevista = revista_atual.Ano;
                wrapper_aux.DataDevolucao = emprestimos.Current.DataEntregaPrevista;
                wrapper_aux.IdRevista = emprestimos.Current.IdRevista;
                wrapper_aux.IdUsuario = emprestimos.Current.IdUsuario;

                // adicionando no IList
                populado.Add(wrapper_aux);
            }
            return populado;
        }
        private static Revista getRevistaByIdRevista(int idRevista, IList<Revista> revistas)
        {
            for (int i = 0; i < revistas.Count; i++)
            {
                Revista retorno = revistas[i];
                if (retorno.Id == idRevista)
                    return retorno;
            }
            return null;
        }
    }
}
